package com.tuju.jetpackfirstdemo

import android.annotation.SuppressLint
import android.app.Application
import android.content.Context
import com.tencent.bugly.crashreport.CrashReport
import com.tuju.jetpackfirstdemo.utils.CrashHandler
import android.app.Activity
import androidx.multidex.MultiDex
import com.tencent.bugly.Bugly
import com.tencent.bugly.beta.Beta
import com.tuju.jetpackfirstdemo.utils.LogcatHelper
import android.widget.Toast
import android.os.Looper
import com.tuju.jetpackfirstdemo.nocrash.Cockroach
import androidx.core.content.ContextCompat.getSystemService
import android.icu.lang.UCharacter.GraphemeClusterBreak.T
import android.os.Handler
import android.util.Log


class App : Application() {

    override fun attachBaseContext(base: Context?) {
        super.attachBaseContext(base)
        MultiDex.install(this)
    }

    override fun onCreate() {
        super.onCreate()
        instants = this

//        initCockroach()

        //在这里为应用设置异常处理，然后程序才能获取未处理的异常
        val crashHandler = CrashHandler.getInstance()
        crashHandler.init(this)

//        CrashReport.initCrashReport(getApplicationContext(), "e01ab05a3f", false)
        Bugly.init(getApplicationContext(), "e01ab05a3f", true)
//        参数1：isManual 用户手动点击检查，非用户点击操作请传false
//        参数2：isSilence 是否显示弹窗等交互，[true:没有弹窗和toast] [false:有弹窗或toast]
        Beta.checkUpgrade(false, false)

//        LogcatHelper.getInstance(this).start()
    }

    fun initCockroach() {
        Cockroach.install { thread, throwable ->
            // handlerException内部建议手动try{  你的异常处理逻辑  }catch(Throwable e){ } ，以防handlerException内部再次抛出异常，导致循环调用handlerException

            //开发时使用Cockroach可能不容易发现bug，所以建议开发阶段在handlerException中用Toast谈个提示框，
            //由于handlerException可能运行在非ui线程中，Toast又需要在主线程，所以new了一个new Handler(Looper.getMainLooper())，
            //所以千万不要在下面的run方法中执行耗时操作，因为run已经运行在了ui线程中。
            //new Handler(Looper.getMainLooper())只是为了能弹出个toast，并无其他用途
            Handler(Looper.getMainLooper()).post(Runnable {
                try {
                    //建议使用下面方式在控制台打印异常，这样就可以在Error级别看到红色log
                    Log.e("AndroidRuntime", "--->CockroachException:$thread<---", throwable)
                    Toast.makeText(this@App, "Exception Happend\n$thread\n$throwable", Toast.LENGTH_SHORT).show()
                    //                        throw new RuntimeException("..."+(i++));
                } catch (e: Throwable) {
                }
            })
        }
    }

    companion object {
        @SuppressLint("StaticFieldLeak")
        lateinit var instants: Context

        var list = ArrayList<Activity>()

        /**
         * Activity关闭时，删除Activity列表中的Activity对象 */
        fun removeActivity(a: Activity) {
            list.remove(a)
        }

        /**
         * 向Activity列表中添加Activity对象 */
        fun addActivity(a: Activity) {
            list.add(a)
        }

        /**
         * 关闭Activity列表中的所有Activity */
        fun finishActivity() {
            for (activity in list) {
                activity?.finish()
            }
            //杀死该应用进程
//            android.os.Process.killProcess(android.os.Process.myPid())
        }
    }

}